import {
	GROUPATTR,
	GROUPTYPE,
	GROUPTYPEREALATIONALL
} from './constant.js';


/**
 * 产品关联关系映射库
 * */
class Relevance {
	constructor(data) {
		this.initData = data;
		this.relevanceMap = Object.create(null);
	}
	
	/**
	 * 初始化关系映射数据
	 * @return {Object}
	 * @example 
	 * {  
	 * 	产品id_属性_类型: [{...关联的产品}, ...]
	 * }
	 * @description 属性: 1加量 2规格(这儿指搭配，如番茄酱)
	 * @description 类型: 0全部 1单品 2双拼分组 3普通分组
	 * */
	init() {
		for (let conRelation of this.initData) {
			let relationList = conRelation.relationList || [];
			for (let relation of relationList) {

				// 区分是加量组还是规格组  groupAttr:1 加量 2：规格
				const groupAttr = relation.groupAttr || GROUPATTR.add;

				// 默认关联关系全部配置，所以下面忽略，但是一旦后期业务调整的话，此处需要修改，对应的套餐的关联关系的逻辑全部都要修改
				if (relation.groupType != GROUPTYPEREALATIONALL) {
					this._keyBy(conRelation.mainProductId, relation, groupAttr, relation.groupType);
					continue
				}
				for (let key in GROUPTYPE) {
					const groupType = GROUPTYPE[key];
					this._keyBy(conRelation.mainProductId, relation, groupAttr, groupType);
				}
			}
		}
		return Object.freeze(this.relevanceMap);
	}
	
	// 添加数据&&去重
	_keyBy(id, relation, groupAttr, type) {
		const index = `${id}_${groupAttr}_${type}`
		if (this.relevanceMap[index]) {
			const found = this.relevanceMap[index].find(el => el.productId == relation.productId); // 去重
			if (!found) this.relevanceMap[index].push(relation);
			this.relevanceMap[index].sort((a, b) => b.isDefault - a.isDefault); // 增加排序，防止影响规格属性的选择索引
		} else {
			this.relevanceMap[index] = [relation];
		}
	}
}

module.exports = Relevance;
